package com.luxx.util;

import java.io.BufferedInputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.HashMap;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Properties;

public class PropertiesUtil {

	/**
	 * 根据key，读取文件对应的值
	 * 
	 * @param fileName
	 *            文件路径，即文件所在包的路径，例如：java/util/config.properties
	 * @param key
	 *            键
	 * @return key对应的值
	 */
	public static String readSingleData(String fileName, String key) {
		//获取绝对路径名
		fileName = getFullFileName(fileName);
		Properties props = new Properties();
		try {
			//获取文件输入流
			InputStream in = new BufferedInputStream(new FileInputStream(fileName));
			props.load(in);
			in.close();
			String value = props.getProperty(key);
			return value;
		} catch (Exception e) {
			e.printStackTrace();
			return null;
		}
	}

	/**
	 * 修改或添加键值对 如果key存在，修改, 反之，添加。
	 * 
	 * @param fileName
	 *            文件路径，即文件所在包的路径，例如：java/util/config.properties
	 * @param key
	 *            键
	 * @param value
	 *            键对应的值
	 */
	public static void writeSingleData(String fileName, String key, String value) {
		Properties prop = new Properties();
		//获取绝对路径名
		fileName = getFullFileName(fileName);
		try {
			File file = new File(fileName);
			if (!file.exists())
				file.createNewFile();
			InputStream fis = new FileInputStream(file);
			prop.load(fis);
			// 一定要在修改值之前关闭fis
			fis.close();
			OutputStream fos = new FileOutputStream(fileName);
			prop.setProperty(key, value);
			// 保存，并加入注释
			prop.store(fos, "Update '" + key + "' value");
			fos.close();
		} catch (IOException e) {
			System.err.println("Visit " + fileName + " for updating " + value + " value error");
		}
	}
	
	/**
	 * 获取整个配置文件内容
	 * 
	 * @param fileName
	 *            文件路径，即文件所在包的路径，例如：java/util/config.properties
	 *            
	 */
	public static Map<String,String>  readDatas(String fileName) {
		//获取绝对路径名
		fileName = getFullFileName(fileName);
		Properties props = new Properties();
		Map<String,String> map=new HashMap<>();
		try {
			//获取文件输入流
			InputStream in = new BufferedInputStream(new FileInputStream(fileName));
			props.load(in);
			in.close();
			for(Entry<Object, Object> object:props.entrySet()){
				//如果KEY和VAULE不空，将这个键值对放入map
				if(object.getKey()!=null&&object.getValue()!=null){
					map.put(object.getKey().toString(), object.getValue().toString());
				}
			}
		} catch (Exception e) {
			e.printStackTrace();
		}
		return map;
	}

	/**
	 * 对文件名进行统一的处理，获取它的绝对路径名称
	 * 
	 * @param fileName 相对路径名称
	 * @return
	 */
	private static String getFullFileName(String fileName) {
		// 获取绝对路径
		fileName = PropertiesUtil.class.getResource("/" + fileName).toString();
		// 截掉路径的"file:/"前缀
		fileName = fileName.substring(6);
		return fileName;
	}
}
